package algorithm.easy;

import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.HashMap;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: algorithm.easy
 * @Author: 江岸
 * @CreateTime: 2021-04-05 10:35
 * @Description: 给你两个有序整数数组 nums1 和 nums2，请你将 nums2 合并到 nums1 中，使 nums1 成为一个有序数组。
 * <p>
 * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n，这样它就有足够的空间保存来自 nums2 的元素。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
 * 输出：[1,2,2,3,5,6]
 * <p>
 * 示例 2：
 * <p>
 * 输入：nums1 = [1], m = 1, nums2 = [], n = 0
 * 输出：[1]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/merge-sorted-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Merge88 {
    public static void main(String[] args) {
        HashMap<Object, Object> map = new HashMap<>();
        String str=new String("abc");
        WeakReference<String> abcWeakRef = new WeakReference<String>(str);
        str = null;
        System.out.println(abcWeakRef.get());
        System.gc();
        System.out.println(abcWeakRef.get());
    }

    //更好的方法是从后往前排序，这样就不需要额外空间
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if (n == 0) return;
        int[] arr = Arrays.copyOf(nums1, m + n);
        int i = 0;
        int j = 0;
        int h = 0;
        while (h<m+n) {
            if (i==m){
                while (j<n){
                    nums1[h] = nums2[j];
                    h++;
                    j++;
                }
                break;
            }
            if (j==n){
                while (i<m){
                    nums1[h] = arr[i];
                    h++;
                    i++;
                }
                break;
            }
            if (arr[i]<=nums2[j]){
                nums1[h] = arr[i];
                i++;
            }else {
                nums1[h] = nums2[j];
                j++;
            }
            h++;
        }
    }
}
